package cn.edu.jxau.test;

import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;

public class Main {

	public static void main(String[] args) throws IOException {

		Main m = new Main();
		System.out.println(m.zipString("welcometonowcoderrrrr"));
	}

	// -------------------------------------
	// 解法1
	// -------------------------------------

//	public String zipString(String iniString) {
//
//		// 1.参数校验 //
//		Objects.requireNonNull(iniString, "参数iniString不能为null");
//		StringBuilder builder = new StringBuilder();
//		for (int i = 0, end = iniString.length(); i < end;) {
//			char ch = iniString.charAt(i++);
//			int count = 1;
//			while (i < end && ch == iniString.charAt(i)) {
//				count++;
//				i++;
//			}
//			builder.append(ch).append(count);
//		}
//		if (builder.length() < iniString.length()) {
//			return builder.toString();
//		} else {
//			return iniString;
//		}
//	}

	// -------------------------------------
	// 解法2
	// -------------------------------------
	public String zipString(String iniString) {

		// 1.参数校验 //
		Objects.requireNonNull(iniString, "参数iniString不能为null");
		int len = zipAfter(iniString);
		if (len >= iniString.length()) {
			return iniString;
		}
		StringBuilder builder = new StringBuilder(len);
		char cur = iniString.charAt(0);
		int count = 1;
		for (int i = 1, end = iniString.length(); i < end; i++) {
			if (cur == iniString.charAt(i)) {
				count++;
			} else {
				builder.append(cur).append(count);
				count = 1;
				cur = iniString.charAt(i);
			}
		}
		builder.append(cur).append(count);
		return builder.toString();
	}

	/**
	 * 计算压缩后字符串长度
	 * 
	 * @param iniString
	 * @return
	 */
	private int zipAfter(String iniString) {

		int len = 0;
		char cur = iniString.charAt(0);
		int count = 1;
		for (int i = 1, end = iniString.length(); i < end; i++) {
			if (cur == iniString.charAt(i)) {
				count++;
			} else {
				len = len + 1 + String.valueOf(count).length();
				count = 1;
				cur = iniString.charAt(i);
			}
		}
		len = len + 1 + String.valueOf(count).length();
		return len;
	}
}